package main

import "fmt"

// 递归：代码复用
// 打印 nums[start...end]
func printArr(nums []int, start int) {
   // 退出条件
   if start > len(nums) - 1 {
      return
   }
   // 第一步：打印 nums[start]
   fmt.Println(nums[start])
   // 第二步：打印 nums[start + 1...end]
   printArr(nums, start + 1)
}

// 迭代：显示栈模拟递归
// 空间复杂度：O(n)
func printArrIter(nums []int) {
   // 定义显示栈，作用和系统栈是一样的
   stack := []int{}
   // 第一次调用 printArr
   stack = append(stack, 0)
   for {
      if len(stack) == 0 {
         return
      }
      start := stack[len(stack) - 1]
      // 弹出栈顶元素
      stack = stack[:len(stack) - 1]
      // 退出条件
      if start > len(nums) - 1 {
         return
      }
      // 第一步：打印第一个元素
      fmt.Println(nums[start])
      // 第二步：调用 printArr，打印 [start + 1...end]
      stack = append(stack, start + 1)
   }
}

func main() {
   nums := []int{10,20,30,40,50}
   printArr(nums, 0)
   printArrIter(nums)
}
